/**
 * Copyright (C), 2015-2021, XXX有限公司
 * FileName: MainApplication
 * Author:   AEO WUGUOZHI
 * Date:     2021/3/22 21:56
 * Description: helloworld
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.bnuz.boot;

/**
 * 〈一句话功能简述〉<br> 
 * 〈helloworld〉
 *
 * @author AEO WUGUOZHI
 * @create 2021/3/22
 * @since 1.0.0
 */


import com.bnuz.boot.bean.User;
import com.bnuz.config.MyConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * 主程序类 相当于启动主程序类，有一个就行了
 * @SpringBootApplication这是一个SpringBoot应用
 *
 * */

@SpringBootApplication(scanBasePackages="com.bnuz")
public class MainApplication {

    public static void main(String[] args) {
        //1,返回我们的IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

//        2，查看容器里面的组件
//        String names[] = run.getBeanDefinitionNames();
//        for (String name : names) {
//            System.out.println(name);
//        }

        //3,从容器中获取组件
        User user = run.getBean("userNo1",User.class);
        User user1 = run.getBean("userNo1",User.class);
        System.out.println(user == user1);          //这里打印true,说明同一个组件。

        //4 MyConfig是一个配置类，它本身也是一个组件
        MyConfig myConfig = run.getBean(MyConfig.class);
        System.out.println(myConfig);            //myConfig是配置类，也是一个组件。配置类里面配置了很多组件。

        //@Configuration(proxyBeanMethods = true) 设置为true是，配置类是（代理对象）
        //com.bnuz.config.MyConfig$$EnhancerBySpringCGLIB$$9713c564@58f174d9
        //5,调用配置类（代理对象）@Configuration(proxyBeanMethods = true)调用方法，SpringBoot总会检查这个组件是否在容器中。
        //保持组件单实例。
        User user2 = myConfig.usero1();
        User user3 = myConfig.usero1();
        System.out.println(user2 == user3);     //当代理组件的方法是true时，会使用容器中的组件，而不是new一个新的。so true

        //@Bean("组件名称")注解
        boolean userNo1 = run.containsBean("userNo1");
        System.out.println("容器中组件userNo1:" + userNo1);

        boolean tomcat = run.containsBean("tomcat");
        System.out.println("容器中组件tomcat:"+tomcat);

        //导入Spring配置资源ImportResource() ; 导入beans.xml
        boolean haha = run.containsBean("haha");
        boolean hehe = run.containsBean("hehe");
        boolean user01 = run.containsBean("user01");
        System.out.println("容器中组件：haha:" + haha + "; hehe:" + hehe + "; user01:" + user01);

        //P15
        String[] beanNamesForType = run.getBeanNamesForType(WebMvcProperties.class);
        System.out.println("====" + beanNamesForType.length);
        //打印1； 跟SpringMVC配置相关的属性都封装在WebMvcProperties.class


    }

}